package com.kj.tms.system.service.menu.serviceImpl;


import com.kj.tms.common.bean.dto.Pager;
import com.kj.tms.common.bean.exception.BusinessException;
import com.kj.tms.common.utils.constant.Consts;
import com.kj.tms.pri.system.menu.service.AssignPermissionService;
import com.kj.tms.pri.system.role.dto.RoleDto;
import com.kj.tms.pri.system.role.service.RoleService;
import com.kj.tms.pri.system.user.dto.UserDto;
import com.kj.tms.pri.system.user.dto.UserOrgDto;
import com.kj.tms.pri.system.user.service.UserOrgService;
import com.kj.tms.pri.system.user.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: wangguoqing
 * @Description: 用户权限管理业务实现类
 * @Date: Created in 10:41 2017/10/23
 * @Company: 北京宏图天安
 * @Version: 2017/10/23
 * @Modified By:
 */
@RestController
public class AssignPermissionServiceImpl implements AssignPermissionService {

    private static final Logger logger = LoggerFactory.getLogger(AssignPermissionServiceImpl.class);


    @Autowired
    private RoleService roleServiceImpl;

    @Autowired
    private UserService userServiceImpl;

    @Autowired
    private UserOrgService userOrgServiceImpl;

    /**
     * @param orgCode  机构编码
     * @param userDto
     * @Title:listOrgByPage
     * @Description 查询用户权限管理机构下的人员信息分页数据
     * @Method
     * @Return Pager 分页
     * @Date: 2017年10月19日 17:42
     * @Author:wangguoqing
     * @version: 2017年10月19日
     */
//    public Pager listOrgByPage(String orgCode, UserDto userDto) {
//        logger.info("用户权限管理主界面，分页查询传入值数据 listOrgByPage ---" +
//                "userDto：[" + userDto + "]--机构orgCode：[" + orgCode + ']');
//        Map<String, Object> map = new HashMap<String, Object>();
//        if (!StringUtils.isBlank(userDto.getUserCode())) {
//            map.put("userCode", userDto.getUserCode());
//        }
//        map.put("orgCode", orgCode);
//        map.put("validMark", Consts.VALID_MARK_1);
//        logger.info("查询用户权限管理机构下的人员信息分页数据--listOrgByPage--" +
//                "传值 map[" + map + "]---PageNo:" + userDto.getPageNo() + "---PageSize" + userDto.getPageSize());
//        Pager pager = userDto.getPager();
//        map.put("endSize", pager.getPageNo() * pager.getPageSize());
//        map.put("startSize", (pager.getPageNo() - 1) * pager.getPageSize() + 1);
//        //访问  查询机构人员列表 方法
//        List<UserDto> userDtosList = userServiceImpl.listOrgByPage(map);
//        pager.setResults(userDtosList);
//        pager.setRowCount(userServiceImpl.getUserOrgCount(map));
//        //角色
//        for (UserDto dto : userDtosList) {
//            Map<String, Object> roleMap = new HashMap<>();
//            roleMap.put("userId", dto.getUserId());
//            roleMap.put("curUserOrgCode", orgCode);
//            dto.setRoleDtos(roleServiceImpl.listByUserOrg(roleMap));
//        }
//        logger.info("查询用户权限管理机构下的人员信息分页数据--listOrgByPage--结果集：pager [" + pager.toString() + "]");
//        return pager;
//    }

    /**
     * @param userDto
     * @param orgCode
     * @return Pager 返回类型
     * @throws Exception
     * @Title: listWaitUserByOrg
     * @Description: 查询等待分配的机构人员分页数据
     */
    @Override
    public Pager listWaitUserByOrg(@RequestBody UserDto userDto, @RequestParam("orgCode") String orgCode) {
        Map<String, Object> map = new HashMap<String, Object>();
        logger.info("查询等待分配的机构人员分页数据 listWaitUserByOrg ---" +
                "userDto：[" + userDto + "]--机构orgCode：[" + orgCode + ']');
        if (!StringUtils.isBlank(userDto.getUserName())) {
            map.put("userName", userDto.getUserName());
        }
        if (!StringUtils.isBlank(userDto.getOrganization())) {
            map.put("organization", userDto.getOrganization());
        }
        map.put("orgCode", orgCode);
        Pager pager = userDto.getPager();
        map.put("endSize", pager.getPageNo() * pager.getPageSize());
        map.put("startSize", (pager.getPageNo() - 1) * pager.getPageSize() + 1);
        //访问  查询机构人员列表 方法
        pager.setResults(userServiceImpl.listWaitUser(map));
        pager.setRowCount(userServiceImpl.getWaitUserCount(map));
        return pager;
    }

    /**
     * @param model
     * @return Pager 返回类型
     * @throws
     * @Title: listRoleByPage
     * @Description: 查询机构用户分配角色分页数据
     */
    @Override
    public Pager listRoleByPage(@RequestBody RoleDto model) {
        logger.info("查询机构用户分配角色分页数据传入值数据 queryRoleyPage ---model：[" + model + "]");
        model.setDelMark(Consts.DEL_MARK_0);
        /** 1、使用redis start   **/
//        //在这里先查询redis中是否含有角色信息 Consts.ROLE
//        List<RoleDto> roleListR = redisAccessImpl.lrandge(Consts.ROLE, 0, -1);
//
//        Pager pager = model.getPager();
//
//        int page = pager.getPageNo();//页数
//        int size = pager.getPageSize();//每页条数
//        //分页计算
//        Integer  endSize =   page*size;
//        Integer startSize = (page-1)*size;//针对于redis 中lrandge 下标从0开始截取
//        List<RoleDto> roleList = redisAccessImpl.lrandge(Consts.ROLE, startSize, endSize);
//        pager.setResults(roleList);
//
//        pager.setRowCount(roleListR.size());
        /** 1、使用redis end   **/

        //2、使用数据库查询
        Pager pager = roleServiceImpl.queryByPage(model);

        return pager;
    }

    /**
     * @param userIds 用户Id   多个用','分割
     * @param orgCode 机构编码
     * @return void 返回类型
     * @throws Exception
     * @Title: saveOrgByUser
     * @Description: 批量添加机构人员
     */
    @Override
    public void saveOrgByUser(@RequestParam("userIds") String userIds, @RequestParam("orgCode") String orgCode) {
        String[] personnelIds = userIds.split(",");
        List<UserOrgDto> dtos = new ArrayList<>();
        //添加之前删除原有配置，避免重复（同userId与orgCode）
        for (String id : personnelIds) {
            UserOrgDto dto = new UserOrgDto();
            dto.setUserId(id);
            dto.setOrgCode(orgCode);
            dtos.add(dto);
        }
        if (!dtos.isEmpty()) {
            try{
                userOrgServiceImpl.batchDeleteByUser(personnelIds,orgCode);
                userOrgServiceImpl.batchAddUserOrg(dtos);
            }catch (Exception e){
                logger.error(e.getMessage());
                throw new BusinessException(Consts.ERROR, "分配失败！");
            }

        }
    }

    /**
     * @param userId  用户Id
     * @param orgCode 机构ID
     * @return void 返回类型
     * @throws Exception
     * @Title: deleteByUser
     * @Description: 删除人员机构数据
     */
    @Override
    public void deleteByUser(@RequestParam("userId") String userId, @RequestParam("orgCode") String orgCode) {
        //先删除以前保存的角色信息
        roleServiceImpl.deleteUserRole(userId, orgCode);
        //再删除人员机构信息
        userOrgServiceImpl.deleteByUser(userId, orgCode);
    }

    /**
     * 添加人员机构的角色
     *
     * @param roleIds
     * @param orgCode
     * @param userId
     */

    public void saveRoleByOrgPersonal(@RequestParam("roleIds") String roleIds, @RequestParam("orgCode") String orgCode, @RequestParam("userId") String userId) {
        roleServiceImpl.deleteUserRole(userId, orgCode);//先删除以前保存的角色信息
        if (!StringUtils.isBlank(roleIds)) {
            String[] roleIdsArrry = roleIds.split(",");
            List<Object> dtos = new ArrayList<Object>();
            for (String roleId : roleIdsArrry) {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("userId", userId);
                map.put("orgCode", orgCode);
                map.put("roleId", roleId);
                dtos.add(map);
            }
            if (!dtos.isEmpty()) {
                roleServiceImpl.batchAddUserRole(dtos);
            }
        }
    }

}
